/*
 * @(#)SimpleWrite.java	1.12 98/06/25 SMI
 *
 * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license 
 * to use, modify and redistribute this software in source and binary
 * code form, provided that i) this copyright notice and license appear
 * on all copies of the software; and ii) Licensee does not utilize the
 * software in a manner which is disparaging to Sun.
 *
 * This software is provided "AS IS," without a warranty of any kind.
 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
 * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
 * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE
 * SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS
 * BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
 * HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING
 * OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * This software is not designed or intended for use in on-line control
 * of aircraft, air traffic, aircraft navigation or aircraft
 * communications; or in the design, construction, operation or
 * maintenance of any nuclear facility. Licensee represents and
 * warrants that it will not use or redistribute the Software for such
 * purposes.
 */

import java.io.*;
import java.util.*;
//import javax.comm.*;
import gnu.io.*;
import java.io.IOException;

public class WriteSerialNmea {
	static Enumeration portList;
	static CommPortIdentifier portId;
	static SerialPort serialPort;
	static OutputStream outputStream;

	public static void main(String[] args) {
		WriteSerialNmea seriell_out = new WriteSerialNmea(args[0]);
		seriell_out.write("Hello output!\n");
	}

	public WriteSerialNmea(SerialPort sport) {
		serialPort = sport;
		System.out.println("output stream on existing port "
				+ serialPort.getName() + " oeffnen");
		this.openOutput();
	}

	public WriteSerialNmea(String port) {
		this.openPort(port);
	}

	public WriteSerialNmea(String port, SerialPort sport) {
		serialPort = sport;
		if (port.equals(serialPort.getName())) {
			System.out.println("output stream on existing port "
					+ serialPort.getName() + " oeffnen");
			this.openOutput();
		} else {
			this.openPort(port);
		}

	}

	public void openPort(String port) {

		portList = CommPortIdentifier.getPortIdentifiers();

		while (portList.hasMoreElements()) {
			portId = (CommPortIdentifier) portList.nextElement();
			if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
				if (portId.getName().equals(port)) {
					System.out.println("output port oeffnen #"
							+ portId.getName());
					// if (portId.getName().equals("/dev/term/a")) {
					try {
						serialPort = (SerialPort) portId.open("SimpleWriteApp",
								2000);
					} catch (PortInUseException e) {
						System.out.println("Port in use\n");
					}
					try {
						serialPort.setSerialPortParams(4800,
								SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
								SerialPort.PARITY_NONE);
					} catch (UnsupportedCommOperationException e) {
					}
					this.openOutput();
				}
			}
		}
	}

	public void openOutput() {
		try {
			outputStream = serialPort.getOutputStream();

		} catch (IOException e) {
		}
	}

	public void write(String m) {
		String nmeaOut = m;
		(new Thread(new WriterThread(outputStream, nmeaOut))).start();
	}

	public static class WriterThread implements Runnable {
		OutputStream out;
		String nmeaOut;

		public WriterThread(OutputStream out, String m) {
			this.out = out;
			this.nmeaOut = m;
		}

		public void run() {
			try {
				nmeaOut = nmeaOut + "\n";
				outputStream.write(nmeaOut.getBytes());
				System.out.print("NMEA-OUT:  " + nmeaOut);
			} catch (IOException e) {
			}
		}
	}
}
